/*
 *================================================================================
 *	Plik: f_movw.c
 *	Created on: May 29, 2011
 *--------------------------------------------------------------------------------
 *	Autorzy: Piotr Zdunek, Mateusz Słowikowski, Krzysztof Wiąckowski
 *	Projekt: Model mikrokontrolera AVR
 *	Kompilator: avr-gcc-4.3.5
 *	Doc: doxygen 1.4.3
 *--------------------------------------------------------------------------------
 *	Zawiera: Funkcję realizującą instrukcję MOVW
 *--------------------------------------------------------------------------------
 *	Komentarze:
 *================================================================================
 */

/*! \file f_movw.c
 * \brief Plik opisujący funkcję MOVW
 */

#include "types.h"
#include "mem_abs.h"

void F_MOVW() {
	
	/*!  void F_MOVW(void){}
	 *  \n \n
	 *  MOVW - funkcja przenosząca dwa rejestry położone obok siebie
	 *  do dwóch innych rejestrów położonych obok siebie.
	 *
	 *  \ref pagemovw \n
	 */
	 
int reg_num[] = {0,2,4,6,8,10,12,14,16,18,20,21,22,24,26,28,30};
#ifndef  DEBUG_MODE
	printf("Function MOVW.");
#endif
	uint8_t Rd = (getMEMC(getPC()) & 0x00F0) >> 4; 			//identyfikacja numeru rejestru arg. 1
	uint8_t Rr = (getMEMC(getPC()) & 0x000F); 				//identyfikacja numeru rejestru arg. 2
	uint8_t Rd_val = getRegister( reg_num[Rd] ) % MAX_DATA_VAL; 			//pobranie zawartosci rejestru arg 1
	uint8_t Rd2_val = getRegister( reg_num[Rd] + 1) % MAX_DATA_VAL;
	uint8_t Rr_val = getRegister(reg_num[Rr]) % MAX_DATA_VAL; 			//pobranie zawartosci rejestru arg 2
	uint8_t Rr2_val = getRegister(reg_num[Rr] + 1) % MAX_DATA_VAL;

	setRegister(reg_num[Rd], Rr_val);
	setRegister(reg_num[Rd]+1,Rr2_val);

	incPC();

}

/*! \page pagemovw Opis działania funkcji MOVW
 *
 *	MOVW - funkcja przenosząca dwa rejestry położone obok siebie
 *  do dwóch innych rejestrów położonych obok siebie
 *
 *	\dontinclude f_movw.c
 *
 *	\section sec_movw1 Operacje rejestrowe oraz arytmetyczno-logiczne
 *
 *	1. Deklaracja dozwolonych wartości rejestrów Rr i Rd:
 *	\skipline reg_num[16]
 *	2. Identyfikacja numeru rejestru arg. 1:
 *	\skipline Rd
 *	3. Identyfikacja numeru rejestru arg. 2:
 *	\skipline Rr
 *	4. Pobranie zawartosci rejestru Rd, Rd+1, Rr, Rr+1 :
 *	\skipline reg_num[Rd]
 *	\until reg_num[Rr] + 1
 *	5. Zapisanie wartości rejestrów Rr i Rr+1 do rejestrów Rd i Rd+1 :
 *	\skipline setRegister
 *	\until Rr2
 *	6. Zwiększenie PC:
 *	\skipline inc
 *
 *	\section sec_movw2 Kod źródłowy funkcji
 *
 *	\include f_movw.c
 *
 */
